package deep2jvmdvm;

/**
 * *******************************************************
 * Author: chinadragon
 * Time: 2020/12/29 上午10:11
 * Name:验证虚拟机栈（栈帧中的局部变量）中引用的对象作为 GC Root
 * Overview:
 * Usage:
 *
 * Java GC日志查看  https://blog.csdn.net/u013613428/article/details/53763925
 *
 * JVM常用参数简介
 * https://blog.csdn.net/saibeidehuangyan/article/details/109644617
 *
 * https://wenku.baidu.com/view/d76e7c1732126edb6f1aff00bed5b9f3f90f72da.html
 *
  Java Idea设置运行内存大小（开发必备）
 https://blog.csdn.net/weixin_41979605/article/details/114368464?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-114368464-blog-106567440.pc_relevant_multi_platform_whitelistv2&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-114368464-blog-106567440.pc_relevant_multi_platform_whitelistv2&utm_relevant_index=1


 JVM之GC算法、垃圾收集算法——标记-清除算法、复制算法、标记-整理算法、分代收集算法
 https://www.cnblogs.com/java-spring/p/9923423.html


 IDEA 中 Run/Debug configurations 没有 VM options
 https://blog.csdn.net/daobuxinzi/article/details/125039426


 * *******************************************************
 */
public class GCRootLocalVariable {
    private int _10MB = 10 * 1024 * 1024;
    private byte[] memory = new byte[8 * _10MB];

    public static void main(String[] args){
        System.out.println("程序开始:");
        printMemory();
        method();
        System.gc();
        System.out.println("第二次GC完成");
        printMemory();




        /*
             vm 参数：-Xms200m


             程序开始:
            free is 197 M, total is 200 M,
            第一次GC完成
            free is 116 M, total is 200 M,
            第二次GC完成
            free is 198 M, total is 200 M,

            可以看出：

        当第一次 GC 时，g 作为局部变量，引用了 new 出的对象（80M），并且它作为 GC Roots，在 GC 后并不会被 GC 回收。
        当第二次 GC：method() 方法执行完后，局部变量 g 跟随方法消失，不再有引用类型指向该 80M 对象，所以第二次 GC 后此 80M 也会被回收。
        注意：上面日志包括后面的实例中，因为有中间变量，所以会有 1M 左右的误差，但不影响我们分析 GC 过程。

         */
    }

    public static void method() {
        GCRootLocalVariable g = new GCRootLocalVariable();
        System.gc();
        System.out.println("第一次GC完成");
        printMemory();
    }

    /**
     * 打印出当前JVM剩余空间和总的空间大小
     */
    public static void printMemory() {
        System.out.print("free is " + Runtime.getRuntime().freeMemory()/1024/1024 + " M, ");
        System.out.println("total is " + Runtime.getRuntime().totalMemory()/1024/1024 + " M, ");
    }
}
